package activiti2;

import com.sun.xml.internal.fastinfoset.util.StringArray;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;

import java.io.*;
import java.util.List;

/**
 * 流程定义的增删该查
 */
public class LiuChengDingYiCRUD {

    /**流程引擎（核心对象），默认加载类路径下命名为activiti.cfg.xml*/
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**
     * 查询
     */
    @Test
    public void findProcessDifinitionList(){
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
                // 查询条件
                .processDefinitionKey("myProcess_1")// 按照流程定义的key
//                .processDefinitionId("myProcess_1:2:12504")//按照流程定义的ID
                .orderByProcessDefinitionVersion().desc()// 排序
                // 返回结果
                // .singleResult()//返回惟一结果集
                // .count()//返回结果集数量
                // .listPage(firstResult, maxResults)
                .list();
        if(list != null && list.size()>0){
            for (ProcessDefinition pd : list) {
                System.out.println("流程定义的ID：" + pd.getId());
                System.out.println("流程定义的名称:" + pd.getName());
                System.out.println("流程定义的KEY:" + pd.getKey());
                System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
                System.out.println("流程定义的资源名称:" + pd.getResourceName());
                System.out.println("流程定义的版本：" + pd.getVersion());
                System.out.println("###############################################");
            }
        }
    }

    /**
     * 删除流程定义
     */
    @Test
    public void deleteProcessDifinition(){
        //部署对象ID
        String deploymentId = "12501";
        processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
                .deleteDeployment(deploymentId,true);//true-->递归删除（级联删除）

        System.out.println("删除成功~~~");//使用部署ID删除流程定义,true表示级联删除
    }


    /**
     * 获取流程定义文档的资源
     */
    @Test
    public void viewPng() throws IOException {

        //部署ID
        String deploymentId = "1";
        //获取的资源名称
        List<String> list = processEngine.getRepositoryService()
                .getDeploymentResourceNames(deploymentId);//使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
        //获得资源名称后缀.png
        String resourceName = "";
        if(list != null && list.size()>0){
            for(String name:list){
                if(name.indexOf(".png")>=0){//返回包含该字符串的第一个字母的索引位置
                    resourceName = name;
                }
            }
        }

        //获取输入流，输入流中存放.PNG的文件
        InputStream in = processEngine.getRepositoryService()
                .getResourceAsStream(deploymentId, resourceName);//使用repositoryService的getResourceAsStream方法传入部署ID和资源图片名称可以获取部署下指定名称文件的输入流

        //将获取到的文件保存到本地
        String[] arr = resourceName.split("/");
        File fileDir = new File("E:/"+arr[0]);//创建文件夹
        fileDir.mkdirs();
        File file = new File("E:/" + resourceName);//创建文件
        file.createNewFile();
        LiuChengDingYiCRUD.copyInputStreamToFile(file,in);
        System.out.println("文件保存成功！");

    }

    private static void copyInputStreamToFile(File file, InputStream input)
            throws IOException {
        int index;
        byte[] bytes = new byte[1024];
        FileOutputStream downloadFile = new FileOutputStream(file);
        while ((index = input.read(bytes)) != -1) {
            downloadFile.write(bytes, 0, index);
            downloadFile.flush();
        }
        downloadFile.close();
        input.close();
    }

}
